home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / ftp.c < prev    next >
Text File  |  1989-03-26  |  4KB  |  199 lines

  1. /* Stuff common to both the FTP server and client */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #ifdef MAC
  9. #include "MacBinary.h"
  10. #endif
  11. #include "ftp.h"
  12. #include "session.h"
  13.  
  14. /* FTP Data channel Receive upcall handler */
  15. void
  16. ftpdr(tcb,cnt)
  17. struct tcb *tcb;
  18. int16 cnt;
  19. {
  20.     register struct ftp *ftp;
  21.     struct mbuf *bp;
  22.     char c;
  23.  
  24.     ftp = (struct ftp *)tcb->user;
  25.     if(ftp->state != RECEIVING_STATE){
  26.         close_tcp(tcb);
  27.         return;
  28.     }
  29.     /* This will likely also generate an ACK with window rotation */
  30.     recv_tcp(tcb,&bp,cnt);
  31.  
  32. #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
  33.     if(ftp->type == ASCII_TYPE){
  34.         while(pullup(&bp,&c,1) == 1){
  35.             if(c != '\r')
  36.                 putc(c,ftp->fp);
  37.         }
  38.         return;
  39.     }
  40. #endif
  41.     while(bp != NULLBUF){
  42.         if(bp->cnt != 0)
  43. #ifdef MAC
  44.         { if(ftp->MacBinary && ftp->MBftp)
  45.             MBwrite(ftp->mbfp,bp->data,(unsigned)bp->cnt);
  46.           else {
  47.             if(ftp->fp == stdout){
  48.                 while(pullup(&bp,&c,1) == 1){
  49.                     if(c != '\r')
  50.                         putc(c,ftp->fp);
  51.                 }
  52.             } else {
  53.                   fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
  54.               }
  55.            }
  56.          }
  57. #else
  58.             fwrite(bp->data,1,(unsigned)bp->cnt,ftp->fp);
  59. #endif
  60.         bp = free_mbuf(bp);
  61.     }
  62. }
  63. /* FTP Data channel Transmit upcall handler */
  64. void
  65. ftpdt(tcb,cnt)
  66. struct tcb *tcb;
  67. int16 cnt;
  68. {
  69.     struct ftp *ftp;
  70.     struct mbuf *bp;
  71.     register char *cp;
  72.     register int c;
  73.     int eof_flag;
  74.  
  75.     ftp = (struct ftp *)tcb->user;
  76.     if(ftp->state != SENDING_STATE){
  77.         close_tcp(tcb);
  78.         return;
  79.     }
  80.     if((bp = alloc_mbuf(cnt)) == NULLBUF){
  81.         /* Hard to know what to do here */
  82.         return;
  83.     }
  84.     eof_flag = 0;
  85.     if(ftp->type == IMAGE_TYPE){
  86. #ifdef MAC
  87.         if(ftp->MacBinary && ftp->MBftp)
  88.             bp->cnt = MBread(ftp->mbfp,bp->data,cnt);
  89.         else
  90.             bp->cnt = fread(bp->data,1,cnt,ftp->fp);
  91. #else
  92.         bp->cnt = fread(bp->data,1,cnt,ftp->fp);
  93. #endif
  94.         if(bp->cnt != cnt)
  95.             eof_flag = 1;
  96.     } else {
  97.         cp = bp->data;
  98.         while(cnt > 1){
  99.             if((c = getc(ftp->fp)) == EOF){
  100.                 eof_flag=1;
  101.                 break;
  102.             }
  103. #if (defined(CPM) || defined(MSDOS))
  104.             /* ^Z is CP/M's text EOF marker, and it is sometimes used
  105.              * by MS-DOS editors too
  106.              */
  107.             if(c == CTLZ){
  108.                 eof_flag = 1;
  109.                 break;
  110.             }
  111. #endif
  112. #if (defined(UNIX) || defined(MAC) || defined(AMIGA))
  113.             if(c == '\n'){
  114.                 *cp++ = '\r';
  115.                 bp->cnt++;
  116.                 cnt--;
  117.             }
  118. #endif
  119.             *cp++ = c;
  120.             bp->cnt++;
  121.             cnt--;
  122.         }
  123.     }
  124.     if(bp->cnt != 0)
  125.         send_tcp(tcb,bp);
  126.     else
  127.         free_p(bp);
  128.  
  129.     if(eof_flag){    /* EOF seen */
  130. #ifdef MAC
  131.         if(ftp->MacBinary && ftp->MBftp){
  132.             MBclose(ftp->mbfp);
  133.             free(ftp->mbfp);
  134.             ftp->mbfp = NULLMBF;
  135.             ftp->MBftp = MACB_OFF;
  136.         }
  137.         else
  138.             fclose(ftp->fp);
  139. #else
  140.         fclose(ftp->fp);
  141. #endif
  142.         ftp->fp = NULLFILE;
  143.         close_tcp(tcb);
  144.     }
  145. }
  146. /* Allocate an FTP control block */
  147. struct ftp *
  148. ftp_create(bufsize)
  149. unsigned bufsize;
  150. {
  151.     void ftp_delete();
  152.     register struct ftp *ftp;
  153.  
  154.     if((ftp = (struct ftp *)calloc(1,sizeof (struct ftp))) == NULLFTP)
  155.         return NULLFTP;
  156.     if(bufsize != 0 && (ftp->buf = malloc(bufsize)) == NULLCHAR){
  157.         ftp_delete(ftp);
  158.         return NULLFTP;
  159.     }
  160.     ftp->state = COMMAND_STATE;
  161.     ftp->type = ASCII_TYPE;    /* Default transfer type */
  162. #ifdef MAC
  163.     ftp->MacBinary = MACB_OFF; /* Default is MacBinary off */
  164.     ftp->mbfp = NULLMBF;    /* Set to null MB pointer */
  165.     ftp->MBftp = MACB_OFF;    /* Default is MacBinary off */
  166. #endif
  167.     return ftp;
  168. }
  169. /* Free resources, delete control block */
  170. void
  171. ftp_delete(ftp)
  172. register struct ftp *ftp;
  173. {
  174. #ifdef MAC
  175.     if(ftp->MacBinary)
  176.         if(ftp->mbfp != NULLMBF){
  177.             MBclose(ftp->mbfp);
  178.             free(ftp->mbfp);
  179.         }
  180. #endif
  181.     if(ftp->fp != NULLFILE && ftp->fp != stdout)
  182.         fclose(ftp->fp);
  183.     if(ftp->data != NULLTCB)
  184.         del_tcp(ftp->data);
  185.     if(ftp->username != NULLCHAR)
  186.         free(ftp->username);
  187.     if(ftp->path != NULLCHAR)
  188.         free(ftp->path);
  189.     if(ftp->buf != NULLCHAR)
  190.         free(ftp->buf);
  191.     if(ftp->cd != NULLCHAR)
  192.         free(ftp->cd);
  193.     if(ftp->session != NULLSESSION)
  194.         freesession(ftp->session);
  195.     free((char *)ftp);
  196. }
  197.  
  198.  
  199.